package com.sugon.service;

import com.sugon.entity.SysMsgEntity;
import com.sugon.utils.ProcessInfoEnum;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 系统消息推送
 *
 * @author SUNLIANQIANG
 * @data 2019-08-02
 */
public interface SysMsgService {

    /**
     * 根据消息类别、业务数据ID和用户ID查询所有匹配记录
     *
     * @param dataType 数据类别
     * @param dataId   业务数据ID
     * @param userId   用户ID
     * @throws Exception
     */
    List<SysMsgEntity> listAll(String dataType, String dataId, String userId);

    /**
     * 系统消息添加
     *
     * @param msgEntity 系统消息中心表作为整体参数做插入
     * @return 返回包装类，以便于后面更好做判断
     * @throws Exception
     */
    Integer inSysMsgService(SysMsgEntity msgEntity);

    /**
     * 系统消息更新
     *
     * @param msgEntity 系统消息中心表作为整体参数做更新
     * @return 返回包装类，以便于后面更好做判断
     * @throws Exception
     */

    Integer upSysMsgService(SysMsgEntity msgEntity);

    /**
     * 查看系统消息推送，根据权限来查询
     *
     * @param msgEntity 系统消息中心表作为整体参数
     * @return 返回Map泛型的List集合，然后进行遍历取数据，就是方便
     * @throws Exception
     */
    List<Map<String, Object>> seeSysMsgService(String deptId);

    /**
     * 流程走完后就不需要了，直接做物理删除(走逻辑删除后面数据量大的话，那些冗余数据放在数据库中对数据库来说是一种压力)
     *
     * @param data_id   流程表id
     * @param data_type 流程类型
     * @param startDate 开始日期
     * @return 返回包装类，以便于后面更好做判断
     * @throws Exception
     */
    Integer delSysMsgService(String data_id, String data_type, Date startDate);

    /**
     * 根据类型查询属于用户的某个类型所有的消息
     *
     * @param type   消息类别
     * @param userId 用户ID
     * @return
     * @throws Exception
     */
    List<Map<String, Object>> querySysMsgService(String type, String userId);

    /**
     * 根据点击的次数修改查看记录
     *
     * @param msgEntity
     * @return
     * @throws Exception
     */
    Integer upSysMsgDataService(SysMsgEntity msgEntity);

    Map allMsgData(SysMsgEntity msgEntity);

    List<Map<String, Object>> queryDept();

    /**
     * 添加提醒事项,主要为维修工单提醒事项
     *
     * @param approveItemType 提醒事项类别
     * @param ticketId        工单ID
     * @param userId          需要被通知的用户
     * @return
     */
    void addRemindItem(ProcessInfoEnum approveItemType, String ticketId, String userId);

    /**
     * 添加审批事项
     *
     * @param approveItemType 提醒事项类别
     * @param dataId          业务数据ID
     * @param userId          需要被通知的用户
     * @param approveLevel    审批LEVEL
     * @return
     */
    void addApproveItem(ProcessInfoEnum approveItemType, String dataId, String userId, int approveLevel);

    /**
     * 添加审批事项
     *
     * @param approveItemType 审批事项类别
     * @param msgEntity       消息实体
     * @param approveLevel    审批层级，某一个审批的第几级审批,从0开始
     * @return
     */
    void addApproveItem(ProcessInfoEnum approveItemType, SysMsgEntity msgEntity, int approveLevel);

    /**
     * 添加模具关联位置换件审批事项
     *
     * @param sparePartRecordId 换件记录ID
     * @param approveLevel      审批级别
     */
    void addMoldReplacePartApproveItem(String sparePartRecordId, int approveLevel);

    /**
     * 添加设备维护计划变更审批事项
     *
     * @param ticketId     设备维护工单ID
     * @param approveLevel 审批级别
     */
    void addDevMaintenancePlanChangeApproveItem(String ticketId, int approveLevel);

    /**
     * 添加备件需求计划审批事项
     *
     * @param sparePartNeedsPlanId 备件需求计划ID
     * @param approveLevel         审批级别
     */
    void addSparePartNeedsPlanApproveItem(String sparePartNeedsPlanId, int approveLevel);

    /**
     * 添加车间备件安全库存审批事项
     *
     * @param id           车间备件安全库存配置ID
     * @param approveLevel 审批级别
     */
    void addSparePartSafeStockApproveItem(String id, int approveLevel);

    /**
     * 添加备模具维修审批事项
     *
     * @param moldRepairRecordId 模具维修记录
     * @param approveLevel       审批级别
     */
    void addMoldRepairApproveItem(String moldRepairRecordId, int approveLevel);

    /**
     * 添加备模具维护审批事项
     *
     * @param moldRepairRecordId 模具维护记录
     * @param approveLevel       审批级别
     */
    void addMoldMaintenanceApproveItem(String moldRepairRecordId, int approveLevel);

    /**
     * 添加工装周期性检测计划审批事项
     *
     * @param checkPlanId  工装周期性检测计划ID
     * @param approveLevel 审批级别
     */
    void addToolsCheckPlanApproveItem(String checkPlanId, int approveLevel);

    /**
     * 生成备件审批事项消息
     *
     * @param sparePartId  备件ID
     * @param approveLevel 审批级别,设置到多层审批时，指定由第几层进行审批,从0开始
     */
    void generateSparePartApproveItemMsg(String sparePartId, int approveLevel);

}
